#ifndef BD_H_INCLUDED
#define BD_H_INCLUDED
#include <string.h>
#define FPRODUCTOS "productos.dat"
#define FUSUARIOS  "usuarios.dat"
#define MAXPROD     40
#define MAXUSR      20

typedef struct stad{int t; int dato; }estad;

typedef struct product
{
    char *nombre;
    char *descripcion;
    char *codigo;
    int precio;
    int stock;
    estad dia;
    estad semana;
    estad mes_act;
    estad mes_ant;
    estad mes_ant2;
    int total;
    int compra;
    struct product * sig;
    struct product * ant;
    struct product * ant2;
    struct product * sig2;
} nodo_producto;

typedef enum asdf200{ADMIN,VEND,INV}tipoUsuario;

typedef struct usr
{
    char *nombre;
    char *pass;
    tipoUsuario id;
    estad dia;
    estad semana;
    estad mes_act;
    estad mes_ant;
    estad mes_ant2;
    int total;
    struct usr * sig;
    struct usr * ant;
    struct usr * ant2;
    struct usr * sig2;
} nodo_usuario;

typedef struct busq_p
{
    nodo_producto * prod;
    int cant;
    struct busq_p * ant;
    struct busq_p * sig;
} res_busq_p;

typedef struct busq_u
{
    nodo_usuario * usr;
    struct busq_u * ant;
    struct busq_u * sig;
} res_busq_u;

typedef struct{
    int dia;
    int mes;
    int semana;
    int year;
}FECHA;

nodo_usuario *vendActual;
nodo_producto * prodAuxInicial;

void inicializarBd(nodo_usuario **usuarios,nodo_producto **productos);
int cerrarBd(void);
void agregarProd(nodo_producto * nuevo);
void agregarUsr(nodo_usuario * nuevo);
void liberarListaP(nodo_producto * inicio);
void liberarStructP(nodo_producto * estructura);
void liberarListaU(nodo_usuario * inicio);
void liberarStructU(nodo_usuario * estructura);
res_busq_p * buscarProd(nodo_producto * filtro,int tipo);
nodo_producto * buscarProd2(nodo_producto * filtro,int cmp, int y_o);
res_busq_u * buscarUsr(nodo_usuario * filtro,int tipo);
nodo_usuario * buscarUsr2(nodo_usuario * filtro,int tipo);
int contenida(const char * palabra,const char * test,int tipo);
void borrarProducto(nodo_producto * nodo);
void borrarUsuario(nodo_usuario * nodo);
void liberarResBusqP(res_busq_p * nodo);
void liberarResBusqU(res_busq_u * nodo);
void obtNumPU(int * usuarios, int * productos);
void guardarBD(void);
nodo_producto * ordenarListaP(nodo_producto * lista,int (*comp)(const void * nodo1,const void * nodo2),int aux);
int compProdNomAZ(const void * nodo1,const void * nodo2);
int compProdNomZA(const void * nodo1,const void * nodo2);
int compProdPrecioDes(const void * nodo1,const void * nodo2);
int compProdPrecioAs(const void * nodo1,const void * nodo2);
int compProdStockDes(const void * nodo1,const void * nodo2);
int compProdStockAs(const void * nodo1,const void * nodo2);
int compProdCodAZ(const void * nodo1,const void * nodo2);
int compProdCodZA(const void * nodo1,const void * nodo2);
int compProdVentMesAcAs(const void * nodo1,const void * nodo2);
int compProdVentMesAntAs(const void * nodo1,const void * nodo2);
int compProdVentMesAnt2As(const void * nodo1,const void * nodo2);
int compProdVentTotalAs(const void * nodo1,const void * nodo2);
int compProdVentSemanaAs(const void * nodo1,const void * nodo2);
int compProdVentDiaAs(const void * nodo1,const void * nodo2);
//
int compProdVentMesAcDes(const void * nodo1,const void * nodo2);
int compProdVentMesAntDes(const void * nodo1,const void * nodo2);
int compProdVentMesAnt2Des(const void * nodo1,const void * nodo2);
int compProdVentTotalDes(const void * nodo1,const void * nodo2);
int compProdVentSemanaDes(const void * nodo1,const void * nodo2);
int compProdVentDiaDes(const void * nodo1,const void * nodo2);
nodo_producto * buscarProdFecha(FECHA * fecha,int mes);

#endif // BD_H_INCLUDED
